#include<iostream>
using namespace std;
namespace zjw
{
template<class T>
class auto_ptr
{
public:
	auto_ptr(T*ptr)
		:_ptr(ptr)
	{
	}
	~auto_ptr()
	{
		if (_ptr)
		{
			cout << "delete" << _ptr << endl;
			delete _ptr;


		}
	
	
	
	
	}

	auto_ptr(auto_ptr<T>& ap)
		:_ptr(ap._ptr)
	{
		ap._ptr = nullptr;
	
	
	
	}
	T& operator*()
	{
		return *_ptr;
	
	
	}

	T* operator->()
	{
		return _ptr;
	
	}
    

private:
	T* _ptr;

};

void test_auto()
{
	auto_ptr<int> ap1(new int(1));
	auto_ptr<int>ap2(ap1);

	*ap1 = 1;
	*ap2 = 1;
}

template<class T>
class unique_ptr
{
public:
	unique_ptr(T* ptr)
		:_ptr(ptr)
	{
	}
	~unique_ptr()
	{
		if (_ptr)
		{
			cout << "delete" << _ptr << endl;
			delete _ptr;


		}




	}


	T& operator*()
	{
		return *_ptr;


	}

	T* operator->()
	{
		return _ptr;

	}
	//c++11
	/*unique_ptr(const unique_ptr<T>& ap) = delete;
	unique_ptr<T>& operator=(const unique_ptr<T>& ap) = delete;*/

private:
	T* _ptr;
	unique_ptr(const unique_ptr<T>& ap);
	unique_ptr<T>& operator=(const unique_ptr<T>& ap);
};

void test_unique()
{

	unique_ptr<int>up1(new int(1));
	unique_ptr<int>up2(up1);




}









}


int main()
{
	//zjw::test_auto();
	zjw::test_unique();

}